package com.jiazhong.service;
// 导入Spring JDBC核心模块中的JdbcTemplate类，用于简化JDBC操作
import org.springframework.jdbc.core.JdbcTemplate;
// 导入Spring的@Service注解，标识这是一个服务层组件
import org.springframework.stereotype.Service;

/**
 * 使用@Service注解标记这是一个Spring服务层组件
 * 实现AccountService接口，提供账户相关的业务逻辑实现
 */
@Service
public class AccountServiceImpl implements AccountService{
    // 声明一个final的JdbcTemplate成员变量，用于数据库操作
// final修饰表示这个引用在初始化后不能被修改
    private final JdbcTemplate jdbcTemplate ;

    /**
     * 构造方法，通过依赖注入方式接收JdbcTemplate实例
     * @param jdbcTemplate Spring自动注入的JdbcTemplate实例
     */
    public AccountServiceImpl(JdbcTemplate jdbcTemplate) {
// 将注入的JdbcTemplate实例赋值给成员变量
        this.jdbcTemplate = jdbcTemplate;
    }
    @Override
    public void transfer(String fromAccountId, String toAccountId, Double amount) {
        //模拟网络延迟或系统故障导致的异常
        //使用随机数生成50%的概率抛出异常
        //这是为了演示事务处理的需要
        if (Math.random()<0.5){
            //抛出运行时异常，模拟转账失败
            throw new RuntimeException("模拟转账失败");
        }
        //2.执行sql更新，向转入账户增加指定金额
        //参数1：sql语句，使用占位符
        //参数2：转账金额amount，对应第一个占位符
        //参数3：转入账户Id，对应第二个占位符
        jdbcTemplate.update("UPDATE account SET balance = balance - ? WHERE id = ?",
                amount, fromAccountId);

// 模拟网络延迟或系统故障导致的异常
// 使用随机数生成50%的概率抛出异常
// 这是为了演示事务处理的需要
        if (Math.random() < 0.5) {
// 抛出运行时异常，模拟转账失败
            throw new RuntimeException("模拟转账失败！");
        }

// 2. 执行SQL更新，向转入账户增加指定金额
// 参数1: SQL语句，使用占位符?
// 参数2: 转账金额amount，对应第一个占位符
// 参数3: 转入账户ID，对应第二个占位符
        jdbcTemplate.update("UPDATE account SET balance = balance + ? WHERE id = ?",
                amount, toAccountId);

    }
}
